package cn.iocoder.yudao.module.ad.plan.dal.mysql;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.business.basic.dao.mapper.CoreMapper;
import cn.iocoder.yudao.framework.business.basic.dao.query.CoreLambdaQueryWrapper;
import cn.iocoder.yudao.module.ad.plan.dal.dataobject.AdPlanDO;
import cn.iocoder.yudao.module.api.ad.plan.enums.AdPlanStatusEnum;
import org.apache.ibatis.annotations.Mapper;

import java.util.Set;

/**
 * 广告投放计划 Mapper
 *
 * @author 山野羡民（1032694760@qq.com）
 */
@Mapper
public interface AdPlanMapper extends CoreMapper<AdPlanDO> {

    default AdPlanDO selectAvailableByRandom(Set<Long> excludePlanIds) {
        CoreLambdaQueryWrapper<AdPlanDO> wrapper = new CoreLambdaQueryWrapper<>();
        wrapper.eq(AdPlanDO::getStatus, AdPlanStatusEnum.START.getValue());
        wrapper.notIn(CollUtil.isNotEmpty(excludePlanIds), AdPlanDO::getId, excludePlanIds); // 排除已看过的广告
        wrapper.last(" ORDER BY RAND()");
        wrapper.limitN(1);
        return selectOne(wrapper);
    }

    default AdPlanDO selectAvailableByRandom(Long excludeUserId, Set<Long> excludePlanIds) {
        CoreLambdaQueryWrapper<AdPlanDO> wrapper = new CoreLambdaQueryWrapper<>();
        wrapper.eq(AdPlanDO::getStatus, AdPlanStatusEnum.START.getValue());
        wrapper.ne(excludeUserId != null && excludeUserId > 0, AdPlanDO::getUserId, excludeUserId); // 排除自己投的广告
        wrapper.ne(CollUtil.isNotEmpty(excludePlanIds), AdPlanDO::getId, excludePlanIds); // 排除已看过的广告
        wrapper.last(" ORDER BY RAND()");
        wrapper.limitN(1);
        return selectOne(wrapper);
    }

}
